
"""

1，写一个lambda表达式，实现两个数的相加
2，编写函数，第一个参数指定今天是星期几（1 ~ 7），第二个参数指定天数n，返回n天后是星期几。
3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
"""
from functools import reduce
import time
import numpy as np

class Practice0805:

    def __init__(self  , *args):
        self.num1 = args[0]
        self.num2 = args[1]
        self.today_week = args[2]
        self.add_day = args[3]
        self.num_list = args[4]

    def num1_num2_add(self):
        #1，写一个lambda表达式，实现两个数的相加
        try:
            num1 = int(self.num1)
            num2 = int(self.num2)
            func = lambda x , y : x +y
            result = func(num1 , num2)
            print(f'lambda表达式计算：{num1}+{num2}={result}')
            return result
        except TypeError:
                print('num1，num2必须为数值类型')
        except ValueError:
            print('num1必须为数值类型')
        except:  # 可以捕获所有类型的错误
            print('其它异常')


    def get_week(self):
        #2，编写函数，第一个参数指定今天是星期几（1 ~ 7），第二个参数指定天数n，返回n天后是星期几。
        today_week = self.today_week
        add_day = self.add_day
        week_array = [1, 2, 3, 4, 5, 6, 7]
        if today_week < week_array[0] or today_week > week_array[len(week_array) - 1]:
            print(f"今天的星期几错误，必须在{week_array[0]}和{week_array[len(week_array) - 1]}")
            return "Error"

        today_week_index = today_week - 1
        for index in range(add_day):
            today_week_index += 1
            # print(index)
            if today_week_index == len(week_array):
                today_week_index = 0
        print(f'今天是星期{today_week}，{add_day}天后是星期{week_array[today_week_index]}')

    def get_week2(self , curentDate = 1 , days = 0):
        # 2，编写函数，第一个参数指定今天是星期几（1 ~ 7），第二个参数指定天数n，返回n天后是星期几。
        # 定义星期几字典(天:星期几}  #初始化字典   week_dict= {1: 'monday', 2: 'Tuesday', 3: 'wednesday', 4: 'Thursday', 5: 'Friday', 6: 'saturday', 7: 'sunday'}
        week_dict = {i + 1:day for i, day in enumerate(['monday', 'Tuesday', 'wednesday', 'Thursday', 'Friday', 'saturday', 'sunday']) }
        #print( 'week_dict=', week_dict)
        # 计算几天后，返回1-7，对应星期一至星期日
        tempDate = curentDate + days
        certainDate = tempDate % 7
        # 根据键名获取键值，得到星期几
        result = week_dict[certainDate]
        print(f"今天是{curentDate}-{week_dict[curentDate]},{days}后是{certainDate}-{week_dict[certainDate]}")
        return result

    def get_week3(self):
        today_week = self.today_week
        add_day = self.add_day
        # 2，编写函数，第一个参数指定今天是星期几(1 ~ 7)，第二个参数指定天数n，返回n天后是星期几。
        f = lambda a, n: 7 if (a + n) % 7 == 0 else (a + n) % 7
        result = f(today_week, add_day)
        print(f'今天是星期{today_week}，{add_day}天后是星期{result}')
        return result
    def square_sum(self):
        #3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
        #pass
        sum_ = 0
        for num in self.num_list:
            sum_ += num ** 2
        print(f"普函数计算,列表：{self.num_list},每一个元素都取一下平方，然后累加求和:{sum_}")
        return sum_


    def square_sum2(self):
        #3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
        #pass
        #先用map将列表元素转换（计算平方），再通过reduce() 累计序列
        sum_ = reduce(lambda a, b: a+b, map(lambda n:n**2 , self.num_list))  # 10
        print(f"高级函数计算,列表：{self.num_list},每一个元素都取一下平方，然后累加求和:{sum_}")
        return sum_
    def square_sum3(self):
        #3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
        #pass
        mylist=list(self.num_list)
        sum_=sum([i**2 for i in mylist])
        print(f"高级函数计算sum(),列表：{self.num_list},每一个元素都取一下平方，然后累加求和:{sum_}")
        return sum_

    def square_sum4(self):
        #3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
        #pass
        sum_ = reduce(lambda x,y:x+y**2,self.num_list,0)
        print(f"高级函数计算reduce(),列表：{self.num_list},每一个元素都取一下平方，然后累加求和:{sum_}")
        return sum_

    def square_sum5(self):
        #3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
        #pass
        sum_ = sum(list(map(lambda x: x ** 2, self.num_list)))
        print(f"高级函数计算sum()+map(),列表：{self.num_list},每一个元素都取一下平方，然后累加求和:{sum_}")
        return sum_



    def square_sum6(self):
        #3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
        #pass
        np_list = np.array(self.num_list)
        sum_ = np.sum(np_list ** 2) #把列表中每一个元素都平方后，再进行sum
        print(f"高级函数计算np.sum(),列表：{self.num_list},每一个元素都取一下平方，然后累加求和:{sum_}")
        return sum_

    def square_sum7(self):
        #3，求平方和，有列表[1,……9]，把每一个元素都取一下平方，然后累加求和，使用普通函数和使用高阶函数两种方式解决问题
        #pass
        square = lambda x:x**2
        sum_ = sum(square(i) for i in self.num_list) #把列表中每一个元素都平方后，再进行sum
        print(f"高级函数计算sum(),列表：{self.num_list},每一个元素都取一下平方，然后累加求和:{sum_}")
        return sum_

###############################################
num1 = 1
num2 = 2
num_list = [1 , 2 , 3 , 4 ,5]
obj = Practice0805( num1 , num2, 1 , 3 , num_list )
obj.num1_num2_add()
obj.get_week()
obj.get_week3()
obj.get_week2(curentDate = 1, days=3)

obj.square_sum()
obj.square_sum2()
obj.square_sum3()
obj.square_sum4()
obj.square_sum5()
obj.square_sum6()
obj.square_sum7()


print('*' * 20)

# lambda 表达式实现两个数相加
# func = lambda x,y : x +y
# result = func(num1 , num2)
# print(result)

def sum_suquares(num_list):
    return sum(i**2 for i in num_list)
def sum_suquares_np(num_list):
    np_list = np.array(num_list)
    result = np.sum(np_list**2)
    return result

def sum_squre_HRfuction(num_list):
    square = lambda x:x**2
    return sum(square(i)for i in num_list)

my_list = range(1,1000)
start_time = time.time()
print(sum_suquares(my_list))
end_time = time.time()
print(f"Execution time: {end_time - start_time} seconds")

time.sleep(0.5)
start_time = time.time()
print(sum_suquares_np(my_list))
end_time = time.time()
print(f"Execution time: {end_time - start_time} seconds")
time.sleep(0.5)
start_time = time.time()
print(sum_squre_HRfuction(my_list))
end_time = time.time()
print(f"Execution time: {end_time - start_time} seconds")

#在Python中，%time 是一个IPython或Jupyter Notebook中用于测量代码执行时间的魔术命令（magic command）。
# 但是，如果你在一个标准的Python脚本或解释器中运行它，这个命令将不会工作，并会引发一个错误，因为%time 不是一个Python的内置功能。